package com.simpou.tests.rest.service;

import lombok.AccessLevel;
import lombok.Setter;

import java.util.Date;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;


/**
 * Serviço a ser usado pelas classes de teste.
 *
 * @author Jonas Pereira
 * @since 2013-03-12
 */
@Path("/")
public class RestService {

    /**
     * Objeto a ser retornado por um serviço. É informado externamente para
     * forçar a resposta que se deseja do serviço.
     */
    @Setter
    private static Object object;

    /**
     * Tipo do retorno.
     */
    @Setter
    private static MediaType mediaType;

    /**
     * <p>getSingle.</p>
     *
     * @return Objeto informado externamente.
     */
    @GET
    @Path("single")
    public Response getSingle() {
        return Response.ok(object).type(mediaType).build();
    }

    /**
     * Constrói uma resposta considerando o mecanismo de cache, ou seja,
     * verifica se objeto já está em cache no cliente para determinar como será
     * a resposta. Pode responder simplesmente que o objeto não foi alterado ou
     * retornar o mesmo completo caso não esteja em cache.
     *
     * @param request Requisição.
     * @param object Objeto.
     * @param lastModified Data da última modificação do objeto.
     * @param etagString Identificador único do objeto. É a sua identificação do
     * ponto de vista do cache.
     * @return Resposta considerando mecanismo de cache.
     */
    public static ResponseBuilder getCachedObject(final Request request,
        final Object object, final Date lastModified, final String etagString) {
        final EntityTag eTag = new EntityTag(etagString);
        ResponseBuilder response = request.evaluatePreconditions(lastModified,
                eTag);
        final CacheControl cc = new CacheControl();
        cc.setMaxAge(-1);
        cc.setSMaxAge(-1);

        if (response == null) {
            response = Response.ok(object);
        }

        response.cacheControl(cc).lastModified(lastModified);

        return response;
    }
}
